﻿namespace Net.Share
{
    /// <summary>
    /// 远程过程调用单元接口
    /// </summary>
    public interface IRpcModel
    {
        /// <summary>
        /// 网络指令
        /// </summary>
        byte Cmd { get; set; }
        /// <summary>
        /// 内核? true:数据经过框架内部序列化 false:数据由开发者自己处理
        /// </summary>
        bool Kernel { get; set; }
        /// <summary>
        /// 协议值, 合并之前版本的func字段和methodHash字段
        /// </summary>
        uint Protocol { get; set; }
        /// <summary>
        /// 数据是否经过内部序列化?
        /// </summary>
        bool Serialize { get; set; }
        /// <summary>
        /// 请求和响应的Token, 当几千几万个客户端同时发起相同的请求时, 可以根据Token区分响应, 得到真正的响应值
        /// </summary>
        uint Token { get; set; }
        /// <summary>
        /// 真正数据段索引和长度
        /// </summary>
        int Index { get; set; }
        /// <summary>
        /// 真正数据段索引和长度
        /// </summary>
        int Count { get; set; }
        /// <summary>
        /// 这是内存池数据，这个字段要配合index，count两字段使用，如果想得到实际数据，请使用Buffer属性
        /// </summary>
        byte[] Buffer { get; set; }
        /// <summary>
        /// 数据缓存器(正确的数据段)
        /// </summary>
        byte[] GetBuffer { get; }
        /// <summary>
        /// 远程参数
        /// </summary>
        object[] Pars { get; set; }

        /// <summary>
        /// 每次调用参数都会指向下一个参数
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        T To<T>();

        /// <summary>
        /// 每次调用参数都会指向下一个参数
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        T As<T>() where T : class;

        byte AsByte { get; }
        sbyte AsSbyte { get; }
        bool AsBoolen { get; }
        short AsShort { get; }
        ushort AsUshort { get; }
        char AsChar { get; }
        int AsInt { get; }
        uint AsUint { get; }
        float AsFloat { get; }
        long AsLong { get; }
        ulong AsUlong { get; }
        double AsDouble { get; }
        string AsString { get; }
        object Obj { get; }

        /// <summary>
        /// 刷洗数据
        /// </summary>
        void Flush();

        /// <summary>
        /// 复制远程调用数据模型
        /// </summary>
        /// <returns></returns>
        IRpcModel Copy();
    }
}